<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>segment_contours_xld [HALCON算子参考手册]</title>
<style type="text/css">
      body {
    color: #000000;
    background-color: #ffffff;
    margin: 0;
    font-family: Arial, Helvetica, sans-serif;
}

.body_main {
    margin-left: 35px;
    margin-right: 35px;
}

@media screen and (min-width:992px) {

    .body_main {
        margin-left: 10%;
        margin-right: 10%;
    }

    table.toctable {
        width: 80%
    }
}

@media screen and (min-width:1400px) {

    .body_main {
        margin-left: 15%;
        margin-right: 15%;
    }

    table.toctable {
        width: 70%
    }
}

body>div ul ul {
    margin-left: inherit;
}

a:link {
    color: #0044cc;
}

a:link,
a:visited {
    text-decoration: none;
}

a:link:hover,
a:visited:hover {
    text-decoration: underline;
}

th {
    text-align: left;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    text-rendering: optimizeLegibility;
    color: #666666;
}

code {
    font-family: monospace,monospace;
}

h1 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

h2 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

hr {
    border: 0;
    border-top: solid 1px #f28d26;
}

.pre {
    display: block;
    padding-bottom: 1ex;
    font-family: monospace;
    white-space: pre;
}

pre {
    font-family: monospace, monospace;
    padding: 1ex;
    white-space: pre-wrap;
}

.toc {
    font-size: 80%;
    border-top: 1px dashed #f28d26;
    border-bottom: 1px dashed #f28d26;
    padding-top: 5px;
    padding-bottom: 5px;
}

.inv {
    margin: 0;
    border: 0;
    padding: 0;
}

.banner {
    color: #666666;
    padding-left: 1em;
}

.logo {
    background-color: white;
}

.keyboard {
    font-size: 80%;
    padding-left: 3px;
    padding-right: 3px;
    border-radius: 5px;
    border-width: 1px;
    border-style: solid;
    border-color: #f28d26;
    background-color: #f3f3f3;
}

.warning {
    margin-top: 2ex;
    margin-bottom: 1ex;
    padding: 10px;
    text-align: center;
    border: 1px solid;
    color: #bb0000;
    background-color: #fff7f7
}

.imprint {
    margin-top: 1ex;
    font-size: 80%;
    color: #666666;
}

.imprinthead {
    font-weight: bolder;
    color: #666666;
}

.indexlink {
    text-align: right;
    padding-bottom: 5px;
}

.postscript {
    margin-top: 2ex;
    font-size: 80%;
    color: #666666
}

.evenrow {
    background-color: #e7e7ef;
    vertical-align: top;
}

.oddrow {
    background-color: #f7f7ff;
    vertical-align: top;
}

.headrow {
    background-color: #97979f;
    color: #ffffff;
    vertical-align: top;
}

.logorow {
    vertical-align: top;
}

.error {
    color: red;
}

.var {
    font-style: italic
}

.halconoperator {
    font-family: monospace, monospace;
}

span.operator {
    font-family: monospace, monospace;
}

span.procedure {
    font-family: monospace, monospace;
}

span.operation {
    font-family: monospace, monospace;
}

span.feature {
    font-family: Arial, Helvetica, Homerton, sans-serif;
}

ul {
    padding-left: 1.2em;
}

li.dot {
    list-style-type: square;
    color: #f28d26;
}

.breadcrumb {
    font-size: 80%;
    color: white;
    background-color: #062d64;
    margin-bottom: 20px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 15px;
}

.webbar {
    font-size: 80%;
    background-color: #dddddd;
    margin-top: 0px;
    margin-left: -35px;
    margin-right: -35px;
    margin-bottom: 0px;
    padding-top: 5px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 5px;
}

.footer {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    border-top: 1px dashed #f28d26;
    font-size: 80%;
    color: #666666;
    padding-bottom: 8px;
}

.footer .socialmedia a {
    padding-left: 7px;
}

.socialmedia {
    padding-top: 10px;
}

.copyright {
    margin-top: 19px;
}

.breadcrumb a {
    color: #ffffff;
    border-bottom: 1px solid white;
}

.breadcrumb a:link:hover,
.breadcrumb a:visited:hover {
    text-decoration: none;
    border-bottom: none;
}

.heading {
    margin-top: 1ex;
    font-size: 110%;
    font-weight: bold;
    color: #666666;
}

.text {
    color: black;
}

.example {
    font-size: 80%;
    background-color: #f3f3f3;
    border: 1px dashed #666666;
    padding: 10px;
}

.displaymath {
    display: block;
    text-align: center;
    margin-top: 1ex;
    margin-bottom: 1ex;
}

.title {
    float: left;
    padding-top: 3px;
    padding-bottom: 3px;
}

.signnote {
    font-family: Arial, Helvetica, Homerton, sans-serif;
    font-size: 80%;
    color: #666666;
    font-weight: lighter;
    font-style: italic
}

.par {
    margin-bottom: 1.5em;
}

.parhead {
    text-align: right;
}

.parname {
    float: left;
}

.pardesc {
    font-size: 85%;
    margin-top: 0.5em;
    margin-bottom: 0.5em;
    margin-left: 2em;
}

.parcat {
    color: #666;
    font-weight: bold;
}

*[data-if=cpp],
*[data-if=c],
*[data-if=dotnet],
*[data-if=com],
*[data-if=python] {
    display: none;
}

.tabbar {
    text-align: right;
    border-bottom: 1px solid #f28d26;
    margin-bottom: 0.5em;
}

ul.tabs {
    padding-top: 3px;
    padding-bottom: 3px;
    margin-top: 10px;
    margin-bottom: 0;
    font-size: 80%
}

ul.tabs li {
    padding-top: 3px;
    padding-bottom: 3px;
    display: inline;
    overflow: hidden;
    list-style-type: none;
    margin: 0;
    margin-left: 8px;
    border-top: 1px solid #666;
    border-left: 1px solid #666;
    border-right: 1px solid #666;
}

ul.tabs li.active {
    border-left: 1px solid #f28d26;
    border-right: 1px solid #f28d26;
    border-top: 1px solid #f28d26;
    border-bottom: 1px solid #fff;
}

ul.tabs li.inactive {
    background-color: #eee;
}

ul.tabs li a {
    padding-left: 5px;
    padding-right: 5px;
    color: #666;
}

ul.tabs li a:link:hover {
    text-decoration: none;
}

ul.tabs li.inactive a {
    color: #666;
}

ul.tabs li.active a {
    color: black;
}

dl.generic dd {
    margin-bottom: 1em;
}

.pari {
    color: olive;
}

.paro {
    color: maroon;
}

.comment {
    font-size: 80%;
    color: green;
    white-space: nowrap;
}

table.grid {
    border-collapse: collapse;
}

table.grid td {
    padding: 5px;
    border: 1px solid;
}

table.layout {
    border: 0px;
}

table.layout td {
    padding: 5px;
}

table.table {
    border-collapse: collapse;
}

table.table td {
    padding: 5px;
    border-left: 0px;
    border-right: 0px;
}

table.table tr:last-child {
    border-bottom: 1px solid;
}

table.table th {
    padding: 5px;
    border-top: 1px solid;
    border-bottom: 1px solid;
    border-left: 0px;
    border-right: 0px;
}

.details_summary {
    cursor: pointer;
}

table.toctable {
    width: 100%;
}

table.toctable col:first-child {
    width: 20%;
}

table.toctable col:nth-last-child(2) {
    width: 8%;
}

table.altcolored tr:nth-child(even) {
    background-color: #f3f3f3;
}

    </style>
<!--OP_REF_STYLE_END-->
<script>
    <!--
var active_lang='hdevelop';function switchVisibility(obj,active_lang,new_lang)
{var display_style='inline';
for(var i=0;i<obj.length;i++)
{if(obj.item(i).getAttribute('data-if')==new_lang)
{obj.item(i).style.display=display_style;}
if(obj.item(i).getAttribute('data-if')==active_lang)
{obj.item(i).style.display='none';}}
return;}
function toggleLanguage(new_lang,initial)
{if(active_lang!=new_lang)
{var lis=document.getElementsByTagName('li');for(var i=0;i<lis.length;i++)
{if(lis.item(i).id=='syn-'+new_lang)
{lis.item(i).className='active';}
else
{lis.item(i).className='inactive';}}
var divs=document.getElementsByTagName('div');var spans=document.getElementsByTagName('span');switchVisibility(divs,active_lang,new_lang);switchVisibility(spans,active_lang,new_lang);if(!initial)
{setCookie("halcon_reference_language",new_lang,null,null);}
active_lang=new_lang;}
return;}
function setCookie(name,value,domain,exp_offset,path,secure)
{localStorage.setItem(name,value);}
function getCookie(name)
{return localStorage.getItem(name);}
function initialize()
{var qs=location.href.split('?')[1];var qs_lang_raw=location.href.split('interface=')[1];var qs_lang;if(qs_lang_raw)
{qs_lang=qs_lang_raw.split('#')[0];}
var cookie_lang=getCookie("halcon_reference_language");var new_lang;if((qs_lang=="hdevelop")||(qs_lang=="dotnet")||(qs_lang=="python")||(qs_lang=="cpp")||(qs_lang=="c"))
{new_lang=qs_lang;setCookie("halcon_reference_language",new_lang,null,null);}
else if((cookie_lang=="hdevelop")||(cookie_lang=="dotnet")||(cookie_lang=="python")||(cookie_lang=="cpp")||(cookie_lang=="c"))
{new_lang=cookie_lang;}
else
{new_lang="hdevelop";}
toggleLanguage(new_lang,1);return;}
-->

  </script>
</head>
<body onload="initialize();">
<div class="breadcrumb">
<br class="inv"><a href="index.html">目录</a> / <a href="toc_xld.html">XLD</a> / <a href="toc_xld_transformations.html">变换</a><br class="inv">
</div>
<div class="body_main">
<div class="tabbar"><ul class="tabs">
<li id="syn-hdevelop" class="active"><a href="javascript:void(0);" onclick="toggleLanguage('hdevelop')" onfocus="blur()">HDevelop</a></li>
<li id="syn-dotnet" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('dotnet')" onfocus="blur()">.NET</a></li>
<li id="syn-python" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('python')" onfocus="blur()">Python</a></li>
<li id="syn-cpp" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('cpp')" onfocus="blur()">C++</a></li>
<li id="syn-c" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('c')" onfocus="blur()">C</a></li>
</ul></div>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<!--OP_REF_HEADER_END-->
<h1 id="sec_name">
<span data-if="hdevelop" style="display:inline;">segment_contours_xld</span><span data-if="c" style="display:none;">segment_contours_xld</span><span data-if="cpp" style="display:none;">SegmentContoursXld</span><span data-if="dotnet" style="display:none;">SegmentContoursXld</span><span data-if="python" style="display:none;">segment_contours_xld</span> (算子名称)</h1>
<h2>名称</h2>
<p><code><span data-if="hdevelop" style="display:inline;">segment_contours_xld</span><span data-if="c" style="display:none;">segment_contours_xld</span><span data-if="cpp" style="display:none;">SegmentContoursXld</span><span data-if="dotnet" style="display:none;">SegmentContoursXld</span><span data-if="python" style="display:none;">segment_contours_xld</span></code> — Segment XLD contours into line segments and circular or elliptic arcs.</p>
<h2 id="sec_synopsis">参数签名</h2>
<div data-if="hdevelop" style="display:inline;">
<p>
<code><b>segment_contours_xld</b>(<a href="#Contours"><i>Contours</i></a> : <a href="#ContoursSplit"><i>ContoursSplit</i></a> : <a href="#Mode"><i>Mode</i></a>, <a href="#SmoothCont"><i>SmoothCont</i></a>, <a href="#MaxLineDist1"><i>MaxLineDist1</i></a>, <a href="#MaxLineDist2"><i>MaxLineDist2</i></a> : )</code></p>
</div>
<div data-if="c" style="display:none;">
<p>
<code>Herror <b>segment_contours_xld</b>(const Hobject <a href="#Contours"><i>Contours</i></a>, Hobject* <a href="#ContoursSplit"><i>ContoursSplit</i></a>, const char* <a href="#Mode"><i>Mode</i></a>, const Hlong <a href="#SmoothCont"><i>SmoothCont</i></a>, double <a href="#MaxLineDist1"><i>MaxLineDist1</i></a>, double <a href="#MaxLineDist2"><i>MaxLineDist2</i></a>)</code></p>
<p>
<code>Herror <b>T_segment_contours_xld</b>(const Hobject <a href="#Contours"><i>Contours</i></a>, Hobject* <a href="#ContoursSplit"><i>ContoursSplit</i></a>, const Htuple <a href="#Mode"><i>Mode</i></a>, const Htuple <a href="#SmoothCont"><i>SmoothCont</i></a>, const Htuple <a href="#MaxLineDist1"><i>MaxLineDist1</i></a>, const Htuple <a href="#MaxLineDist2"><i>MaxLineDist2</i></a>)</code></p>
</div>
<div data-if="cpp" style="display:none;">
<p>
<code>void <b>SegmentContoursXld</b>(const HObject&amp; <a href="#Contours"><i>Contours</i></a>, HObject* <a href="#ContoursSplit"><i>ContoursSplit</i></a>, const HTuple&amp; <a href="#Mode"><i>Mode</i></a>, const HTuple&amp; <a href="#SmoothCont"><i>SmoothCont</i></a>, const HTuple&amp; <a href="#MaxLineDist1"><i>MaxLineDist1</i></a>, const HTuple&amp; <a href="#MaxLineDist2"><i>MaxLineDist2</i></a>)</code></p>
<p>
<code><a href="HXLDCont.html">HXLDCont</a> <a href="HXLDCont.html">HXLDCont</a>::<b>SegmentContoursXld</b>(const HString&amp; <a href="#Mode"><i>Mode</i></a>, Hlong <a href="#SmoothCont"><i>SmoothCont</i></a>, double <a href="#MaxLineDist1"><i>MaxLineDist1</i></a>, double <a href="#MaxLineDist2"><i>MaxLineDist2</i></a>) const</code></p>
<p>
<code><a href="HXLDCont.html">HXLDCont</a> <a href="HXLDCont.html">HXLDCont</a>::<b>SegmentContoursXld</b>(const char* <a href="#Mode"><i>Mode</i></a>, Hlong <a href="#SmoothCont"><i>SmoothCont</i></a>, double <a href="#MaxLineDist1"><i>MaxLineDist1</i></a>, double <a href="#MaxLineDist2"><i>MaxLineDist2</i></a>) const</code></p>
<p>
<code><a href="HXLDCont.html">HXLDCont</a> <a href="HXLDCont.html">HXLDCont</a>::<b>SegmentContoursXld</b>(const wchar_t* <a href="#Mode"><i>Mode</i></a>, Hlong <a href="#SmoothCont"><i>SmoothCont</i></a>, double <a href="#MaxLineDist1"><i>MaxLineDist1</i></a>, double <a href="#MaxLineDist2"><i>MaxLineDist2</i></a>) const  <span class="signnote">
            (
            Windows only)
          </span></code></p>
</div>
<div data-if="com" style="display:none;"></div>
<div data-if="dotnet" style="display:none;">
<p>
<code>static void <a href="HOperatorSet.html">HOperatorSet</a>.<b>SegmentContoursXld</b>(<a href="HObject.html">HObject</a> <a href="#Contours"><i>contours</i></a>, out <a href="HObject.html">HObject</a> <a href="#ContoursSplit"><i>contoursSplit</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Mode"><i>mode</i></a>, <a href="HTuple.html">HTuple</a> <a href="#SmoothCont"><i>smoothCont</i></a>, <a href="HTuple.html">HTuple</a> <a href="#MaxLineDist1"><i>maxLineDist1</i></a>, <a href="HTuple.html">HTuple</a> <a href="#MaxLineDist2"><i>maxLineDist2</i></a>)</code></p>
<p>
<code><a href="HXLDCont.html">HXLDCont</a> <a href="HXLDCont.html">HXLDCont</a>.<b>SegmentContoursXld</b>(string <a href="#Mode"><i>mode</i></a>, int <a href="#SmoothCont"><i>smoothCont</i></a>, double <a href="#MaxLineDist1"><i>maxLineDist1</i></a>, double <a href="#MaxLineDist2"><i>maxLineDist2</i></a>)</code></p>
</div>
<div data-if="python" style="display:none;">
<p>
<code>def <b>segment_contours_xld</b>(<a href="#Contours"><i>contours</i></a>: HObject, <a href="#Mode"><i>mode</i></a>: str, <a href="#SmoothCont"><i>smooth_cont</i></a>: int, <a href="#MaxLineDist1"><i>max_line_dist_1</i></a>: float, <a href="#MaxLineDist2"><i>max_line_dist_2</i></a>: float) -&gt; HObject</code></p>
</div>
<h2 id="sec_description">描述</h2>
<p><code><span data-if="hdevelop" style="display:inline">segment_contours_xld</span><span data-if="c" style="display:none">segment_contours_xld</span><span data-if="cpp" style="display:none">SegmentContoursXld</span><span data-if="com" style="display:none">SegmentContoursXld</span><span data-if="dotnet" style="display:none">SegmentContoursXld</span><span data-if="python" style="display:none">segment_contours_xld</span></code> segments the input contours
<a href="#Contours"><i><code><span data-if="hdevelop" style="display:inline">Contours</span><span data-if="c" style="display:none">Contours</span><span data-if="cpp" style="display:none">Contours</span><span data-if="com" style="display:none">Contours</span><span data-if="dotnet" style="display:none">contours</span><span data-if="python" style="display:none">contours</span></code></i></a> into lines if
<a href="#Mode"><i><code><span data-if="hdevelop" style="display:inline">Mode</span><span data-if="c" style="display:none">Mode</span><span data-if="cpp" style="display:none">Mode</span><span data-if="com" style="display:none">Mode</span><span data-if="dotnet" style="display:none">mode</span><span data-if="python" style="display:none">mode</span></code></i></a>=<i><span data-if="hdevelop" style="display:inline">'lines'</span><span data-if="c" style="display:none">"lines"</span><span data-if="cpp" style="display:none">"lines"</span><span data-if="com" style="display:none">"lines"</span><span data-if="dotnet" style="display:none">"lines"</span><span data-if="python" style="display:none">"lines"</span></i>, into lines and circular arcs if
<a href="#Mode"><i><code><span data-if="hdevelop" style="display:inline">Mode</span><span data-if="c" style="display:none">Mode</span><span data-if="cpp" style="display:none">Mode</span><span data-if="com" style="display:none">Mode</span><span data-if="dotnet" style="display:none">mode</span><span data-if="python" style="display:none">mode</span></code></i></a>=<i><span data-if="hdevelop" style="display:inline">'lines_circles'</span><span data-if="c" style="display:none">"lines_circles"</span><span data-if="cpp" style="display:none">"lines_circles"</span><span data-if="com" style="display:none">"lines_circles"</span><span data-if="dotnet" style="display:none">"lines_circles"</span><span data-if="python" style="display:none">"lines_circles"</span></i>, or into lines and elliptic
arcs if <a href="#Mode"><i><code><span data-if="hdevelop" style="display:inline">Mode</span><span data-if="c" style="display:none">Mode</span><span data-if="cpp" style="display:none">Mode</span><span data-if="com" style="display:none">Mode</span><span data-if="dotnet" style="display:none">mode</span><span data-if="python" style="display:none">mode</span></code></i></a>=<i><span data-if="hdevelop" style="display:inline">'lines_ellipses'</span><span data-if="c" style="display:none">"lines_ellipses"</span><span data-if="cpp" style="display:none">"lines_ellipses"</span><span data-if="com" style="display:none">"lines_ellipses"</span><span data-if="dotnet" style="display:none">"lines_ellipses"</span><span data-if="python" style="display:none">"lines_ellipses"</span></i>.  The segmented
contours are returned in <a href="#ContoursSplit"><i><code><span data-if="hdevelop" style="display:inline">ContoursSplit</span><span data-if="c" style="display:none">ContoursSplit</span><span data-if="cpp" style="display:none">ContoursSplit</span><span data-if="com" style="display:none">ContoursSplit</span><span data-if="dotnet" style="display:none">contoursSplit</span><span data-if="python" style="display:none">contours_split</span></code></i></a>.  The information on
whether an output contour represents a line or a circular or
elliptic arc is done via the global contour attribute
<i><span data-if="hdevelop" style="display:inline">'cont_approx'</span><span data-if="c" style="display:none">"cont_approx"</span><span data-if="cpp" style="display:none">"cont_approx"</span><span data-if="com" style="display:none">"cont_approx"</span><span data-if="dotnet" style="display:none">"cont_approx"</span><span data-if="python" style="display:none">"cont_approx"</span></i> (see <a href="get_contour_global_attrib_xld.html"><code><span data-if="hdevelop" style="display:inline">get_contour_global_attrib_xld</span><span data-if="c" style="display:none">get_contour_global_attrib_xld</span><span data-if="cpp" style="display:none">GetContourGlobalAttribXld</span><span data-if="com" style="display:none">GetContourGlobalAttribXld</span><span data-if="dotnet" style="display:none">GetContourGlobalAttribXld</span><span data-if="python" style="display:none">get_contour_global_attrib_xld</span></code></a>
for further information).
</p>
<p><code><span data-if="hdevelop" style="display:inline">segment_contours_xld</span><span data-if="c" style="display:none">segment_contours_xld</span><span data-if="cpp" style="display:none">SegmentContoursXld</span><span data-if="com" style="display:none">SegmentContoursXld</span><span data-if="dotnet" style="display:none">SegmentContoursXld</span><span data-if="python" style="display:none">segment_contours_xld</span></code> first approximates
the input contours by polygons. With this, the contours are oversegmented
in curved areas. After this, the contours are approximated according to
the modes <a href="#Mode"><i><code><span data-if="hdevelop" style="display:inline">Mode</span><span data-if="c" style="display:none">Mode</span><span data-if="cpp" style="display:none">Mode</span><span data-if="com" style="display:none">Mode</span><span data-if="dotnet" style="display:none">mode</span><span data-if="python" style="display:none">mode</span></code></i></a> given below. If <a href="#SmoothCont"><i><code><span data-if="hdevelop" style="display:inline">SmoothCont</span><span data-if="c" style="display:none">SmoothCont</span><span data-if="cpp" style="display:none">SmoothCont</span><span data-if="com" style="display:none">SmoothCont</span><span data-if="dotnet" style="display:none">smoothCont</span><span data-if="python" style="display:none">smooth_cont</span></code></i></a> is set to a
value &gt; 0, the input contours are first smoothed (see
<a href="smooth_contours_xld.html"><code><span data-if="hdevelop" style="display:inline">smooth_contours_xld</span><span data-if="c" style="display:none">smooth_contours_xld</span><span data-if="cpp" style="display:none">SmoothContoursXld</span><span data-if="com" style="display:none">SmoothContoursXld</span><span data-if="dotnet" style="display:none">SmoothContoursXld</span><span data-if="python" style="display:none">smooth_contours_xld</span></code></a>). This can be necessary to prevent very
short segments in the polygonal approximation and to achieve a more
robust fit with circular or elliptic arcs, because the smoothing
suppresses outliers on the contours.
</p>
<p>The calculation of the segmentation depends on the respective selected
method in <a href="#Mode"><i><code><span data-if="hdevelop" style="display:inline">Mode</span><span data-if="c" style="display:none">Mode</span><span data-if="cpp" style="display:none">Mode</span><span data-if="com" style="display:none">Mode</span><span data-if="dotnet" style="display:none">mode</span><span data-if="python" style="display:none">mode</span></code></i></a>:
</p>
<dl class="generic">

<dt><b><i><span data-if="hdevelop" style="display:inline">'lines'</span><span data-if="c" style="display:none">"lines"</span><span data-if="cpp" style="display:none">"lines"</span><span data-if="com" style="display:none">"lines"</span><span data-if="dotnet" style="display:none">"lines"</span><span data-if="python" style="display:none">"lines"</span></i></b></dt>
<dd>
<p>

The Ramer algorithm is used to perform a polygon approximation with
a maximum distance of <a href="#MaxLineDist1"><i><code><span data-if="hdevelop" style="display:inline">MaxLineDist1</span><span data-if="c" style="display:none">MaxLineDist1</span><span data-if="cpp" style="display:none">MaxLineDist1</span><span data-if="com" style="display:none">MaxLineDist1</span><span data-if="dotnet" style="display:none">maxLineDist1</span><span data-if="python" style="display:none">max_line_dist_1</span></code></i></a> (see <a href="gen_polygons_xld.html"><code><span data-if="hdevelop" style="display:inline">gen_polygons_xld</span><span data-if="c" style="display:none">gen_polygons_xld</span><span data-if="cpp" style="display:none">GenPolygonsXld</span><span data-if="com" style="display:none">GenPolygonsXld</span><span data-if="dotnet" style="display:none">GenPolygonsXld</span><span data-if="python" style="display:none">gen_polygons_xld</span></code></a>).
If <a href="#Mode"><i><code><span data-if="hdevelop" style="display:inline">Mode</span><span data-if="c" style="display:none">Mode</span><span data-if="cpp" style="display:none">Mode</span><span data-if="com" style="display:none">Mode</span><span data-if="dotnet" style="display:none">mode</span><span data-if="python" style="display:none">mode</span></code></i></a>=<i><span data-if="hdevelop" style="display:inline">'lines'</span><span data-if="c" style="display:none">"lines"</span><span data-if="cpp" style="display:none">"lines"</span><span data-if="com" style="display:none">"lines"</span><span data-if="dotnet" style="display:none">"lines"</span><span data-if="python" style="display:none">"lines"</span></i>, the parameter
<a href="#MaxLineDist2"><i><code><span data-if="hdevelop" style="display:inline">MaxLineDist2</span><span data-if="c" style="display:none">MaxLineDist2</span><span data-if="cpp" style="display:none">MaxLineDist2</span><span data-if="com" style="display:none">MaxLineDist2</span><span data-if="dotnet" style="display:none">maxLineDist2</span><span data-if="python" style="display:none">max_line_dist_2</span></code></i></a> is ignored.
</p>
</dd>

<dt><b><i><span data-if="hdevelop" style="display:inline">'lines_circles'</span><span data-if="c" style="display:none">"lines_circles"</span><span data-if="cpp" style="display:none">"lines_circles"</span><span data-if="com" style="display:none">"lines_circles"</span><span data-if="dotnet" style="display:none">"lines_circles"</span><span data-if="python" style="display:none">"lines_circles"</span></i> or <i><span data-if="hdevelop" style="display:inline">'lines_ellipses'</span><span data-if="c" style="display:none">"lines_ellipses"</span><span data-if="cpp" style="display:none">"lines_ellipses"</span><span data-if="com" style="display:none">"lines_ellipses"</span><span data-if="dotnet" style="display:none">"lines_ellipses"</span><span data-if="python" style="display:none">"lines_ellipses"</span></i></b></dt>
<dd><p>

The initial polygonal approximation is done by using the Ramer
algorithm (see <a href="gen_polygons_xld.html"><code><span data-if="hdevelop" style="display:inline">gen_polygons_xld</span><span data-if="c" style="display:none">gen_polygons_xld</span><span data-if="cpp" style="display:none">GenPolygonsXld</span><span data-if="com" style="display:none">GenPolygonsXld</span><span data-if="dotnet" style="display:none">GenPolygonsXld</span><span data-if="python" style="display:none">gen_polygons_xld</span></code></a>) with a maximum distance of
<a href="#MaxLineDist1"><i><code><span data-if="hdevelop" style="display:inline">MaxLineDist1</span><span data-if="c" style="display:none">MaxLineDist1</span><span data-if="cpp" style="display:none">MaxLineDist1</span><span data-if="com" style="display:none">MaxLineDist1</span><span data-if="dotnet" style="display:none">maxLineDist1</span><span data-if="python" style="display:none">max_line_dist_1</span></code></i></a>. If the maximum distance of the
resulting arc to the contour is smaller than the maximum distance of
the two line segments, the two line segments are replaced with the
arc. This procedure is iterated until no more changes occur.
After this, the parts of the contour that are still approximated by
line segments are again segmented with a polygonal approximation
with maximum distance <a href="#MaxLineDist2"><i><code><span data-if="hdevelop" style="display:inline">MaxLineDist2</span><span data-if="c" style="display:none">MaxLineDist2</span><span data-if="cpp" style="display:none">MaxLineDist2</span><span data-if="com" style="display:none">MaxLineDist2</span><span data-if="dotnet" style="display:none">maxLineDist2</span><span data-if="python" style="display:none">max_line_dist_2</span></code></i></a>, and the newly created
line segments are merged to circular or elliptical arcs where
possible. This changes the output only if <a href="#MaxLineDist2"><i><code><span data-if="hdevelop" style="display:inline">MaxLineDist2</span><span data-if="c" style="display:none">MaxLineDist2</span><span data-if="cpp" style="display:none">MaxLineDist2</span><span data-if="com" style="display:none">MaxLineDist2</span><span data-if="dotnet" style="display:none">maxLineDist2</span><span data-if="python" style="display:none">max_line_dist_2</span></code></i></a>
differs from <a href="#MaxLineDist1"><i><code><span data-if="hdevelop" style="display:inline">MaxLineDist1</span><span data-if="c" style="display:none">MaxLineDist1</span><span data-if="cpp" style="display:none">MaxLineDist1</span><span data-if="com" style="display:none">MaxLineDist1</span><span data-if="dotnet" style="display:none">maxLineDist1</span><span data-if="python" style="display:none">max_line_dist_1</span></code></i></a>.
This two-step approach is more efficient than a one-step approach with
<a href="#MaxLineDist2"><i><code><span data-if="hdevelop" style="display:inline">MaxLineDist2</span><span data-if="c" style="display:none">MaxLineDist2</span><span data-if="cpp" style="display:none">MaxLineDist2</span><span data-if="com" style="display:none">MaxLineDist2</span><span data-if="dotnet" style="display:none">maxLineDist2</span><span data-if="python" style="display:none">max_line_dist_2</span></code></i></a>, since fewer line segments are generated in
the first step, and hence the circle or ellipse fit has to be
performed less often.  Therefore, parts of the input contours that
can be approximated by long arcs can be found more efficiently.  In
the second step, parts of the input contours that can be
approximated by short arcs are found and the end parts of long
arcs are refined.
In order to benefit from this two-step approach it is recommended to set
<a href="#MaxLineDist2"><i><code><span data-if="hdevelop" style="display:inline">MaxLineDist2</span><span data-if="c" style="display:none">MaxLineDist2</span><span data-if="cpp" style="display:none">MaxLineDist2</span><span data-if="com" style="display:none">MaxLineDist2</span><span data-if="dotnet" style="display:none">maxLineDist2</span><span data-if="python" style="display:none">max_line_dist_2</span></code></i></a> &lt; <a href="#MaxLineDist1"><i><code><span data-if="hdevelop" style="display:inline">MaxLineDist1</span><span data-if="c" style="display:none">MaxLineDist1</span><span data-if="cpp" style="display:none">MaxLineDist1</span><span data-if="com" style="display:none">MaxLineDist1</span><span data-if="dotnet" style="display:none">maxLineDist1</span><span data-if="python" style="display:none">max_line_dist_1</span></code></i></a>.
</p></dd>
</dl>
<p>The resulting contours are at least 3 pixel long and contain at
least 6 successive points of the input contour. All input contours
with a length less than 3 pixel or with less than 6 contour points
are copied to the output contours without modifications.</p>
<h2 id="sec_execution">运行信息</h2>
<ul>
  <li>多线程类型:可重入(与非独占操作符并行运行)。</li>
<li>多线程作用域:全局(可以从任何线程调用)。</li>
  <li>未经并行化处理。</li>
</ul>
<h2 id="sec_parameters">参数表</h2>
  <div class="par">
<div class="parhead">
<span id="Contours" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Contours</span><span data-if="c" style="display:none">Contours</span><span data-if="cpp" style="display:none">Contours</span><span data-if="com" style="display:none">Contours</span><span data-if="dotnet" style="display:none">contours</span><span data-if="python" style="display:none">contours</span></code></b> (input_object)  </span><span>xld_cont(-array) <code>→</code> <span data-if="hdevelop" style="display:inline">object</span><span data-if="dotnet" style="display:none"><a href="HXLDCont.html">HXLDCont</a></span><span data-if="python" style="display:none">HObject</span><span data-if="cpp" style="display:none"><a href="HXLDCont.html">HXLDCont</a></span><span data-if="c" style="display:none">Hobject</span></span>
</div>
<p class="pardesc">Contours to be segmented.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="ContoursSplit" class="parname"><b><code><span data-if="hdevelop" style="display:inline">ContoursSplit</span><span data-if="c" style="display:none">ContoursSplit</span><span data-if="cpp" style="display:none">ContoursSplit</span><span data-if="com" style="display:none">ContoursSplit</span><span data-if="dotnet" style="display:none">contoursSplit</span><span data-if="python" style="display:none">contours_split</span></code></b> (output_object)  </span><span>xld_cont-array <code>→</code> <span data-if="hdevelop" style="display:inline">object</span><span data-if="dotnet" style="display:none"><a href="HXLDCont.html">HXLDCont</a></span><span data-if="python" style="display:none">HObject</span><span data-if="cpp" style="display:none"><a href="HXLDCont.html">HXLDCont</a></span><span data-if="c" style="display:none">Hobject *</span></span>
</div>
<p class="pardesc">Segmented contours.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Mode" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Mode</span><span data-if="c" style="display:none">Mode</span><span data-if="cpp" style="display:none">Mode</span><span data-if="com" style="display:none">Mode</span><span data-if="dotnet" style="display:none">mode</span><span data-if="python" style="display:none">mode</span></code></b> (input_control)  </span><span>string <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">str</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (string)</span><span data-if="dotnet" style="display:none"> (<i>string</i>)</span><span data-if="cpp" style="display:none"> (<i>HString</i>)</span><span data-if="c" style="display:none"> (<i>char*</i>)</span></span>
</div>
<p class="pardesc">Mode for the segmentation of the contours.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>
    <span data-if="hdevelop" style="display:inline">'lines_circles'</span>
    <span data-if="c" style="display:none">"lines_circles"</span>
    <span data-if="cpp" style="display:none">"lines_circles"</span>
    <span data-if="com" style="display:none">"lines_circles"</span>
    <span data-if="dotnet" style="display:none">"lines_circles"</span>
    <span data-if="python" style="display:none">"lines_circles"</span>
</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'lines'</span><span data-if="c" style="display:none">"lines"</span><span data-if="cpp" style="display:none">"lines"</span><span data-if="com" style="display:none">"lines"</span><span data-if="dotnet" style="display:none">"lines"</span><span data-if="python" style="display:none">"lines"</span>, <span data-if="hdevelop" style="display:inline">'lines_circles'</span><span data-if="c" style="display:none">"lines_circles"</span><span data-if="cpp" style="display:none">"lines_circles"</span><span data-if="com" style="display:none">"lines_circles"</span><span data-if="dotnet" style="display:none">"lines_circles"</span><span data-if="python" style="display:none">"lines_circles"</span>, <span data-if="hdevelop" style="display:inline">'lines_ellipses'</span><span data-if="c" style="display:none">"lines_ellipses"</span><span data-if="cpp" style="display:none">"lines_ellipses"</span><span data-if="com" style="display:none">"lines_ellipses"</span><span data-if="dotnet" style="display:none">"lines_ellipses"</span><span data-if="python" style="display:none">"lines_ellipses"</span></p>
</div>
  <div class="par">
<div class="parhead">
<span id="SmoothCont" class="parname"><b><code><span data-if="hdevelop" style="display:inline">SmoothCont</span><span data-if="c" style="display:none">SmoothCont</span><span data-if="cpp" style="display:none">SmoothCont</span><span data-if="com" style="display:none">SmoothCont</span><span data-if="dotnet" style="display:none">smoothCont</span><span data-if="python" style="display:none">smooth_cont</span></code></b> (input_control)  </span><span>integer <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">int</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (integer)</span><span data-if="dotnet" style="display:none"> (<i>int</i> / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>Hlong</i>)</span><span data-if="c" style="display:none"> (<i>Hlong</i>)</span></span>
</div>
<p class="pardesc">Number of points used for smoothing the contours.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>5</p>
<p class="pardesc"><span class="parcat">Suggested values:
      </span>0, 3, 5, 7, 9</p>
<p class="pardesc"><span class="parcat">Restriction:
      </span><code>SmoothCont == 0 || SmoothCont &gt;= 3 &amp;&amp; odd(SmoothCont)</code></p>
</div>
  <div class="par">
<div class="parhead">
<span id="MaxLineDist1" class="parname"><b><code><span data-if="hdevelop" style="display:inline">MaxLineDist1</span><span data-if="c" style="display:none">MaxLineDist1</span><span data-if="cpp" style="display:none">MaxLineDist1</span><span data-if="com" style="display:none">MaxLineDist1</span><span data-if="dotnet" style="display:none">maxLineDist1</span><span data-if="python" style="display:none">max_line_dist_1</span></code></b> (input_control)  </span><span>real <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">float</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real)</span><span data-if="dotnet" style="display:none"> (<i>double</i>)</span><span data-if="cpp" style="display:none"> (<i>double</i>)</span><span data-if="c" style="display:none"> (<i>double</i>)</span></span>
</div>
<p class="pardesc">Maximum distance between a contour and the approximating
line (first iteration).</p>
<p class="pardesc"><span class="parcat">Default:
      </span>4.0</p>
<p class="pardesc"><span class="parcat">Suggested values:
      </span>1.0, 1.5, 2.0, 2.5, 3.0, 3.5</p>
<p class="pardesc"><span class="parcat">Restriction:
      </span><code>MaxLineDist1 &gt;= 0.0</code></p>
</div>
  <div class="par">
<div class="parhead">
<span id="MaxLineDist2" class="parname"><b><code><span data-if="hdevelop" style="display:inline">MaxLineDist2</span><span data-if="c" style="display:none">MaxLineDist2</span><span data-if="cpp" style="display:none">MaxLineDist2</span><span data-if="com" style="display:none">MaxLineDist2</span><span data-if="dotnet" style="display:none">maxLineDist2</span><span data-if="python" style="display:none">max_line_dist_2</span></code></b> (input_control)  </span><span>real <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">float</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real)</span><span data-if="dotnet" style="display:none"> (<i>double</i>)</span><span data-if="cpp" style="display:none"> (<i>double</i>)</span><span data-if="c" style="display:none"> (<i>double</i>)</span></span>
</div>
<p class="pardesc">Maximum distance between a contour and the approximating
line (second iteration).</p>
<p class="pardesc"><span class="parcat">Default:
      </span>2.0</p>
<p class="pardesc"><span class="parcat">Suggested values:
      </span>1.0, 1.5, 2.0, 2.5, 3.0, 3.5</p>
<p class="pardesc"><span class="parcat">Restriction:
      </span><code>MaxLineDist2 &gt;= 0.0</code></p>
</div>
<h2 id="sec_example_all">例程 (HDevelop)</h2>
<pre class="example">
read_image (Image, 'pumpe')
edges_sub_pix (Image, Edges, 'canny', 1.5, 15, 40)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
count_obj (ContoursSplit, Number)
gen_empty_obj (Lines)
gen_empty_obj (Circles)
for I := 1 to Number by 1
  select_obj (ContoursSplit, Contour, I)
  get_contour_global_attrib_xld (Contour, 'cont_approx', Type)
  if (Type == -1)
      concat_obj (Lines, Contour, Lines)
  else
      concat_obj (Circles, Contour, Circles)
  endif
endfor
fit_line_contour_xld (Lines, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, \
                      RowEnd, ColEnd, Nr, Nc, Dist)
fit_circle_contour_xld (Circles, 'atukey', -1, 2, 0, 3, 2, Row, Column, \
                        Radius, StartPhi, EndPhi, PointOrder)
</pre>
<h2 id="sec_predecessors">可能的前置算子</h2>
<p>
<code><a href="gen_contours_skeleton_xld.html"><span data-if="hdevelop" style="display:inline">gen_contours_skeleton_xld</span><span data-if="c" style="display:none">gen_contours_skeleton_xld</span><span data-if="cpp" style="display:none">GenContoursSkeletonXld</span><span data-if="com" style="display:none">GenContoursSkeletonXld</span><span data-if="dotnet" style="display:none">GenContoursSkeletonXld</span><span data-if="python" style="display:none">gen_contours_skeleton_xld</span></a></code>, 
<code><a href="lines_gauss.html"><span data-if="hdevelop" style="display:inline">lines_gauss</span><span data-if="c" style="display:none">lines_gauss</span><span data-if="cpp" style="display:none">LinesGauss</span><span data-if="com" style="display:none">LinesGauss</span><span data-if="dotnet" style="display:none">LinesGauss</span><span data-if="python" style="display:none">lines_gauss</span></a></code>, 
<code><a href="edges_sub_pix.html"><span data-if="hdevelop" style="display:inline">edges_sub_pix</span><span data-if="c" style="display:none">edges_sub_pix</span><span data-if="cpp" style="display:none">EdgesSubPix</span><span data-if="com" style="display:none">EdgesSubPix</span><span data-if="dotnet" style="display:none">EdgesSubPix</span><span data-if="python" style="display:none">edges_sub_pix</span></a></code>
</p>
<h2 id="sec_successors">可能的后置算子</h2>
<p>
<code><a href="fit_line_contour_xld.html"><span data-if="hdevelop" style="display:inline">fit_line_contour_xld</span><span data-if="c" style="display:none">fit_line_contour_xld</span><span data-if="cpp" style="display:none">FitLineContourXld</span><span data-if="com" style="display:none">FitLineContourXld</span><span data-if="dotnet" style="display:none">FitLineContourXld</span><span data-if="python" style="display:none">fit_line_contour_xld</span></a></code>, 
<code><a href="fit_ellipse_contour_xld.html"><span data-if="hdevelop" style="display:inline">fit_ellipse_contour_xld</span><span data-if="c" style="display:none">fit_ellipse_contour_xld</span><span data-if="cpp" style="display:none">FitEllipseContourXld</span><span data-if="com" style="display:none">FitEllipseContourXld</span><span data-if="dotnet" style="display:none">FitEllipseContourXld</span><span data-if="python" style="display:none">fit_ellipse_contour_xld</span></a></code>, 
<code><a href="fit_circle_contour_xld.html"><span data-if="hdevelop" style="display:inline">fit_circle_contour_xld</span><span data-if="c" style="display:none">fit_circle_contour_xld</span><span data-if="cpp" style="display:none">FitCircleContourXld</span><span data-if="com" style="display:none">FitCircleContourXld</span><span data-if="dotnet" style="display:none">FitCircleContourXld</span><span data-if="python" style="display:none">fit_circle_contour_xld</span></a></code>, 
<code><a href="get_contour_global_attrib_xld.html"><span data-if="hdevelop" style="display:inline">get_contour_global_attrib_xld</span><span data-if="c" style="display:none">get_contour_global_attrib_xld</span><span data-if="cpp" style="display:none">GetContourGlobalAttribXld</span><span data-if="com" style="display:none">GetContourGlobalAttribXld</span><span data-if="dotnet" style="display:none">GetContourGlobalAttribXld</span><span data-if="python" style="display:none">get_contour_global_attrib_xld</span></a></code>
</p>
<h2 id="sec_see">参考其它</h2>
<p>
<code><a href="split_contours_xld.html"><span data-if="hdevelop" style="display:inline">split_contours_xld</span><span data-if="c" style="display:none">split_contours_xld</span><span data-if="cpp" style="display:none">SplitContoursXld</span><span data-if="com" style="display:none">SplitContoursXld</span><span data-if="dotnet" style="display:none">SplitContoursXld</span><span data-if="python" style="display:none">split_contours_xld</span></a></code>, 
<code><a href="get_contour_global_attrib_xld.html"><span data-if="hdevelop" style="display:inline">get_contour_global_attrib_xld</span><span data-if="c" style="display:none">get_contour_global_attrib_xld</span><span data-if="cpp" style="display:none">GetContourGlobalAttribXld</span><span data-if="com" style="display:none">GetContourGlobalAttribXld</span><span data-if="dotnet" style="display:none">GetContourGlobalAttribXld</span><span data-if="python" style="display:none">get_contour_global_attrib_xld</span></a></code>, 
<code><a href="smooth_contours_xld.html"><span data-if="hdevelop" style="display:inline">smooth_contours_xld</span><span data-if="c" style="display:none">smooth_contours_xld</span><span data-if="cpp" style="display:none">SmoothContoursXld</span><span data-if="com" style="display:none">SmoothContoursXld</span><span data-if="dotnet" style="display:none">SmoothContoursXld</span><span data-if="python" style="display:none">smooth_contours_xld</span></a></code>, 
<code><a href="gen_polygons_xld.html"><span data-if="hdevelop" style="display:inline">gen_polygons_xld</span><span data-if="c" style="display:none">gen_polygons_xld</span><span data-if="cpp" style="display:none">GenPolygonsXld</span><span data-if="com" style="display:none">GenPolygonsXld</span><span data-if="dotnet" style="display:none">GenPolygonsXld</span><span data-if="python" style="display:none">gen_polygons_xld</span></a></code>
</p>
<h2 id="sec_module">模块</h2>
<p>
Foundation</p>
<!--OP_REF_FOOTER_START-->
<hr>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<div class="footer">
<div class="copyright">HALCON算子参考手册 Copyright © 2015-2023 51Halcon</div>
</div>
</div>
</body>
</html>
